
/**
 * LetStatement类用来表示与let 相关的语句
 * 用于抽象let(例：let foo=1+2*bar;)
 */
class LetStatement extends Statement{

	constructor(props){
		super(props);

		this.token=props.token;
		this.name=props.identifier;
		this.value=props.expression;
		var s="this is a let statement,left is an identifier ";
		s+=props.identifer.getLiteral();
		s+=" right size is value of ";
		s+=this.value.getLiteral();
		this.tokenLiteral=s;
	}
}


class Let{
	//构造函数
	constructor(){

	}

	/**
	 * token的组合关系是否符合let 语句语法表达式指定的规范
	 * parseLetStatement函数的实现逻辑严格遵守语法表达式的规定。
	 * LetStatement := LET IDENTIFIER ASSIGN_SIGN EXPRESSION SEMI
	 */
	parseLetStatement(){
		/**
		 * 以分号结束的代码
		 * let x=123;
		 * let y=1234;
		 *
			[
				Token { TokenType: 0, literal: 'let', lineNumber: 0 },
				Token { TokenType: 1, literal: 'x', lineNumber: 0 },
				Token { TokenType: 2, literal: '=', lineNumber: 0 },
				Token { TokenType: 4, literal: '123', lineNumber: 0 },
				Token { TokenType: 5, literal: ';', lineNumber: 0 },

				Token { TokenType: 0, literal: 'let', lineNumber: 1 },
				Token { TokenType: 1, literal: 'y', lineNumber: 1 },
				Token { TokenType: 2, literal: '=', lineNumber: 1 },
				Token { TokenType: 4, literal: '1234', lineNumber: 1 },
				Token { TokenType: 5, literal: ';', lineNumber: 1 }
			]
		 */

		var props={};
		props.token=this.curToken;
		/**
		 * 判断下一个token中的let右边是否为变量（判断let后边的x是否为变量）
		 * this.curToken为{ TokenType: 0, literal: 'let', lineNumber: 0 }
		 */
		if(!this.expectPeek(this.lexer.IDENTIFIER)){
			return null;
		}

		//等号左边的变量
		var identProps={};
		identProps.token=this.curToken;
		identProps.value=this.curToken.getLiteral();
		props.identifer=new Identifier(identProps);
		/**
		 * 判断下一个token中的x右边是否为等号
		 * 执行this.expectPeek后token为{ TokenType: 2, literal: '=', lineNumber: 0 }
		 */
		if(!this.expectPeek(this.lexer.ASSIGN_SIGN)){
			return null;
		}

		/**
		 * 判断下一个token中的=右边是否为数字
		 * 执行this.expectPeek后token为{ TokenType: 4, literal: '123', lineNumber: 0 }
		 */
		if(!this.expectPeek(this.lexer.INTEGER)){
			return null;
		}

		//获取等号右边的表达式或变量值
		var exprProps={};
		exprProps.token=this.curToken;
		props.expression=new Expression(exprProps);
		/**
		 * 判断下一个token中的123右边是否为分号
		 * 执行this.expectPeek后token为{ TokenType: 5, literal: ';', lineNumber: 0 }
		 */
		if(!this.expectPeek(this.lexer.SEMICOLON)){
			return null;
		}

		var letStatement =new LetStatement(props);
		return letStatement;
	}

	//判断下一个token的类型是否相等
	nextTokenIsEqual(tokenType){
		return this.peekToken.getType()===tokenType;
	}

	/*
	 *判断token的类型
	 */
	expectPeek(tokenType){
		if(this.nextTokenIsEqual(tokenType)){
			//读取下一个token
			this.nextToken();
			return true;
		}else{
			console.log("expectPeek1:");
			return false;
		}
	}




}


module.exports=Let;